home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_10_06 / 1006076b < prev    next >
Text File  |  1992-04-19  |  2KB  |  107 lines

  1. #include "makedef.h"
  2.  
  3. #define    WHITESPACE    " \t\n"
  4.  
  5. TARGET    *parse_makefile(int argc, char *argv[], char *target)
  6. {
  7. FILE    *fp;
  8. TARGET    *head = NULL;
  9. TARGET    *current = NULL;
  10. char    makefile[ DEP_LEN ] = {0};
  11. char    buffer[ CMD_LEN ];
  12. char    *token;
  13.  
  14. parse_options(argc, argv, makefile, target);
  15. if (NULL == (fp = strlen(makefile) ?
  16.     fopen(makefile, "r") : fopen("Makefile", "r"))) 
  17.     fatal_error("could not find makefile");
  18.  
  19. while (fgets(buffer, CMD_LEN, fp)) {
  20.     if (!isspace(buffer[0])) {
  21.     token = strtok(buffer, WHITESPACE);
  22.     if (!head && !strlen(target))
  23.         strcpy(target, token);
  24.     current = add_target(&head, token);
  25.     token = strtok(NULL, WHITESPACE);
  26.     if (!token || strcmp(":", token)) 
  27.         fatal_error("target must be followed by ':'");
  28.     while (token = strtok(NULL, WHITESPACE))
  29.         insert_dependency(current, token);
  30.     } else {
  31.     if (!head)
  32.         fatal_error("command must be preceeded by a target");
  33.     else if (token = skip_ws(buffer))
  34.         insert_cmd(current, token);
  35.     }
  36. }
  37. fclose(fp);
  38. return head;
  39. }
  40.  
  41.  
  42.  
  43. char    *skip_ws(char *s)
  44. {
  45. while (isspace(*s)) s++;
  46. return (('\0'== *s) ? NULL : s);
  47. }
  48.  
  49.  
  50.  
  51. TARGET    *add_target(TARGET **head, char *target)
  52. {
  53. TARGET    *p;
  54.  
  55. if (search_target_list(*head, target))
  56.     fatal_error("duplicate target found");
  57. p = (TARGET *) malloc(sizeof(TARGET));
  58.  
  59. if (p) {
  60.     p->link = *head;
  61.     strcpy(p->target, target);
  62.     p->cmdlink = (CMD *) NULL;
  63.     p->deplink = (DEP *) NULL;
  64.     p->color = WHITE;
  65.     *head = p;
  66. }
  67. return p;
  68. }
  69.  
  70.  
  71.  
  72. DEP    *insert_dependency(TARGET *p, char *dependency)
  73. {
  74. DEP    *q;
  75.  
  76. q = (DEP *) malloc(sizeof(DEP));
  77.  
  78. if (q) {
  79.     q->link = p->deplink;
  80.     strcpy(q->depstr, dependency);
  81.     p->deplink = q;
  82. }
  83. return q;
  84. }
  85.  
  86.  
  87.  
  88. CMD    *insert_cmd(TARGET *p, char *cmd)
  89. {
  90. CMD    *q, *r;
  91.  
  92. q = (CMD *) malloc(sizeof(CMD));
  93.  
  94. if (q) {
  95.     q->link = NULL;
  96.     strcpy(q->cmdstr, cmd);
  97.     q->cmdstr[strlen(q->cmdstr) - 1] = '\0';
  98.     if (r = p->cmdlink) {
  99.     while (r->link)
  100.         r = r->link;
  101.     r->link = q;
  102.     } else
  103.     p->cmdlink = q;
  104. }
  105. return q;
  106. }
  107.